package com.yhn.service;

import com.github.pagehelper.PageInfo;
import com.hospital.common.base.PageResult;
import com.hospital.common.dto.section.PostQueryReqDto;
import com.hospital.common.dto.section.SectionCreateReqDto;
import com.hospital.common.dto.section.SectionQueryReqDto;
import com.hospital.common.dto.section.SectionUpdateReqDto;
import com.hospital.common.pojo.TPostMeta;
import com.hospital.common.pojo.TSection;
import com.hospital.common.vo.section.module.SectionVo;

import java.util.List;
import java.util.Map;

public interface SectionService {
    /**
     * 创建板块
     * @param operatorUserId 操作人用户ID
     * @param req 创建参数
     * @return 新建的板块
     */
    TSection createSection(Long operatorUserId, SectionCreateReqDto req);

    /**
     * 编辑板块
     * @param operatorUserId 操作人用户ID
     * @param req 编辑参数
     * @return 编辑后的板块；若名称重复返回 null
     */
    TSection updateSection(Long operatorUserId, SectionUpdateReqDto req);

    /**
     * 删除板块
     * @param operatorUserId 操作人用户ID
     * @param sectionId 板块ID
     * @return 删除结果：成功返回 1，有帖子不能删除返回 0，板块不存在返回 null，无权限返回 -1
     */
    Integer deleteSection(Long operatorUserId, Long sectionId);

    /**
     * 分配版主
     * @param operatorUserId 操作人用户ID
     * @param sectionId 板块ID
     * @param doctorUserId 医生用户ID
     * @return 分配结果：成功返回 1，医生不存在或角色不对返回 0，板块不存在返回 null，无权限返回 -1
     */
    Integer assignModerator(Long operatorUserId, Long sectionId, Long doctorUserId);

    /**
     * 获取板块公告
     * @param sectionId 板块ID
     * @return 板块信息，包含公告内容
     */
    TSection getSectionNotice(Long sectionId);

    /**
     * 更新板块公告
     * @param operatorUserId 操作人用户ID
     * @param sectionId 板块ID
     * @param notice 公告内容
     * @return 更新结果：成功返回 true，板块不存在返回 null，无权限返回 false
     */
    Boolean updateSectionNotice(Long operatorUserId, Long sectionId, String notice);

    /**
     * 帖子置顶操作
     * @param operatorUserId 操作人用户ID
     * @param postId 帖子ID
     * @param isTop 是否置顶 (0否, 1是)
     * @return 操作结果：成功返回 true，帖子不存在返回 null，无权限返回 false
     */
    Boolean setPostTop(Long operatorUserId, Long postId, Integer isTop);

    /**
     * 帖子加精操作
     * @param operatorUserId 操作人用户ID
     * @param postId 帖子ID
     * @param isPinned 是否加精 (0否, 1是)
     * @return 操作结果：成功返回 true，帖子不存在返回 null，无权限返回 false
     */
    Boolean setPostPinned(Long operatorUserId, Long postId, Integer isPinned);


    /**
     * 查询所有板块数量
     * @return 板块总数
     */
    Integer getAllSectionsCount();

    /**
     * 查询所有板块信息
     * @return 板块信息列表
     */
    List<SectionVo> findAllSection();

    /**
     * 根据板块ID查询板块信息
     * @param id
     * @return 板块信息
     */
    SectionVo findSectionById(Long id);

    /**
     * 根据版主ID查询板块ID列表
     * @param moderatorId 版主ID
     */
    List<Long> findSectionIdsByModeratorId(Long moderatorId);

    /**
     * 分页查询所有板块信息
     * @param pageNum 页码
     * @param pageSize 每页数量
     */
    PageResult<SectionVo> findAllSection(Integer pageNum, Integer pageSize);

    /**
     * 分页查询板块列表
     * @param req 查询请求参数
     * @return 分页的板块列表
     */
    PageInfo<SectionVo> getSections(SectionQueryReqDto req);

    /**
     * 分页查询帖子列表
     * @param req 查询请求参数
     * @return 分页的帖子列表
     */
    PageInfo<TPostMeta> getPosts(PostQueryReqDto req);

    /**
     * 获取所有医生列表（用于分配版主）
     * @return 医生列表
     */
    List<Map<String, Object>> getDoctors();
}
